package pattern;

/**
 * 描述:单例模式
 *
 * 单例模式的优点：
 * 单例模式可以保证内存里只有一个实例，减少了内存的开销。
 * 可以避免对资源的多重占用。
 * 单例模式设置全局访问点，可以优化和共享资源的访问。
 *
 * 单例模式的缺点：
 * 单例模式一般没有接口，扩展困难。如果要扩展，则除了修改原来的代码，没有第二种途径，违背开闭原则。
 * 在并发测试中，单例模式不利于代码调试。在调试过程中，如果单例中的代码没有执行完，也不能模拟生成一个新的对象。
 * 单例模式的功能代码通常写在一个类中，如果功能设计不合理，则很容易违背单一职责原则。
 *
 * @author Madison You
 * @created 22:24
 */
public class Singleton {
}

/*懒汉式*/
class SingletonLazy{
    private static SingletonLazy instance = null;
    private SingletonLazy(){}
    public static SingletonLazy getInstance() {
        if (instance == null) {
            instance = new SingletonLazy();
        }
        return instance;
    }
}

/*饿汉式*/
class SingletonHungury{
    private static SingletonHungury instance = new SingletonHungury();
    private SingletonHungury(){}
    public static SingletonHungury getInstance(){
        return instance;
    }
}

/*双重校验式*/
class SingletonCheck{
    private static volatile SingletonCheck instance = null;
    private SingletonCheck(){}
    public static SingletonCheck getInstance() {
        if (instance == null) {
            synchronized (SingletonCheck.class) {
                if (instance == null) {
                    instance = new SingletonCheck();
                }
            }
        }
        return instance;
    }
}